MVCC(multi-version concurrency control)
スナップショット分離 snapshot isolationの実装
このページはMySQL前提
MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.2.4 一貫性非ロック読み取り
MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.2.12 InnoDB マルチバージョン
T1中にT2が更新をしてもT1は古いバージョンのデータを参照することでプレミス premiseを保証する
明示的なロックが不要になる
クラスタインデックスのある行が更新される
行データはUNDOログに対比される
インデックスの行にはロールバックポインタが記録されUNDOログを示す
さらに行データが更新されるとUNDOログに対比され再帰的に遡れるようになっている
DELETEの場合はUNDOログは生成される削除マーカーがつくのみ
UNDOレコードや削除マーカーがついた行はパージスレッドによりバックグラウンドで削除される
そのレコードを参照する必要のあるトランザクションがなければ削除できる
削除されていないUNDOログはHistry Listに保存されている
MVCCはノンロッキングリードでしか使われない
ロックしないのでロック競合は起こさず古いデータを読める
MVCCを利用している限りはファントムリード phantom readsを防げる
更新処理の場合最新のデータに対して行われなければならないし更新が終わるまでロックが必要
ロッキングリードではMVCCは使われない
プレミスを保証したければ明示的なselect for updateやselect lock in share modeなどが必要
ノンロッキングリード/ロッキングリードで読み取る値が変わると言うこと
分離レベルがSerializableだった場合、MVCCは使われないがファントムは防ぐ必要がある
ファントムを防ぐ=ある範囲でレコードが挿入されないことを保証する必要がある
まだ存在しないのでレコードロック record lockはとれない
ネクストキーロック next-key lock